#!/usr/bin/env python3
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.

import os
import sys

import yaml


def os_family(distro):
    "Given a distribution, returns a operating system family."
    family = None
    if distro in ['centos', 'centos7', 'fedora', 'rhel', 'rhel7']:
        family = 'redhat'
    elif distro in ['debian', 'ubuntu']:
        family = 'debian'
    elif distro == 'opensuse':
        family = 'suse'
    return family


def merge_data(source, destination, distro):
    """Merges two dictionaries and filters on distro.

    Merges two dictionaries and filters on distro family, or default (in order)
    """
    result = dict()
    result.update(destination)
    family = os_family(distro)
    for servicename, mapping in source.items():
        if servicename in result:
            raise Exception("%s already found in services list" % servicename)
        if distro in mapping:
            result[servicename] = mapping.get(distro)
        elif family in mapping:
            result[servicename] = mapping.get(family)
        elif 'default' in mapping:
            result[servicename] = mapping.get('default')
        else:
            result[servicename] = servicename

    return result


def write_data_to_file(data, service_file_path):
    """Writes yaml data to a specified path."""
    with open(service_file_path, 'w') as destination:
        yaml.dump(data, destination, default_flow_style=False)


def main():
    elements = yaml.safe_load(os.environ.get("IMAGE_ELEMENT_YAML"))
    service_names = dict()
    for element, path in elements.items():
        data_path = os.path.join(path, "svc-map")
        if os.path.exists(data_path):
            with open(data_path, 'r') as dataFile:
                data = yaml.safe_load(dataFile.read())
                try:
                    service_names = merge_data(
                        data,
                        service_names,
                        os.environ.get("DISTRO_NAME"))
                except Exception as err:
                    print("%s.  Check %s for duplicate"
                          " service name." % (err, element))
                    sys.exit(1)

    write_data_to_file(
        service_names,
        os.path.join(os.environ['TMP_MOUNT_PATH'], 'tmp', 'svc-map-services'))


if __name__ == "__main__":
    main()
